package org.generic.test06;

import java.util.ArrayList;
import java.util.List;

/**
 * @author CSY
 * @date 2025 - 03 - 23
 */
public class GenericExtends {
    public static void main(String[] args) {
        Object o = new String("hello");

        //泛型没有继承性
//        List<Object> list = new ArrayList<String>();

        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<AA> list3 = new ArrayList<>();
        List<BB> list4 = new ArrayList<>();
        List<CC> list5 = new ArrayList<>();

        //没有问题，可以接收任意泛型类型
        printCollection1(list1);
        printCollection1(list2);
        printCollection1(list3);
        printCollection1(list4);
        printCollection1(list5);

        //参数只支持集合且泛型必须时AA或者其子类 - 否则报错
//        printCollection2(list1);
//        printCollection2(list2);
        printCollection2(list3);
        printCollection2(list4);
        printCollection2(list5);

        //参数只支持集合且泛型必须时AA或者其父类 - 否则报错
        printCollection3(list1);
//        printCollection3(list2);
        printCollection3(list3);
//        printCollection3(list4);
//        printCollection3(list5);
    }

    //?表示支持任意泛型类型的数据
    public static void printCollection1(List<?> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }
    //? extends AA 表示支持AA类以及AA类的子类
    public static void printCollection2(List<? extends AA> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }
    //? super AA 表示支持AA类以及AA类的父类，不限于直接父类
    public static void printCollection3(List<? super AA> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }
}

class AA{

}

class BB extends AA{

}

class CC extends BB{

}